home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / tracker_3_19.lzh / tracker / randomize.c < prev    next >
C/C++ Source or Header  |  1993-11-11  |  2KB  |  83 lines

  1. /* randomize.c */
  2.  
  3. /* $Id: randomize.c,v 3.2 1992/12/03 15:00:50 espie Exp espie $ 
  4.  * $Log: randomize.c,v $
  5.  * Revision 3.2  1992/12/03  15:00:50  espie
  6.  * restore stty.
  7.  *
  8.  * Revision 3.1  1992/11/19  20:44:47  espie
  9.  * Protracker commands.
  10.  *
  11.  * Revision 3.0  1992/11/18  16:08:05  espie
  12.  * New release.
  13.  *
  14.  */
  15.  
  16. /* input: a series of names (as argv[1:argc - 1])
  17.  * output: the same names, in a random order.
  18.  * with the new database lookup facility, very useful for e.g.,
  19.  * tracker `randomize *` (jukebox)
  20.  */
  21.  
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include "defs.h"
  25.  
  26. LOCAL char *id="$Id: randomize.c,v 3.2 1992/12/03 15:00:50 espie Exp espie $";
  27.  
  28. /* n = random_range(max): output a number in the range 0:max - 1.
  29.  * For our purpose, we don't have to get a very random number,
  30.  * so the standard generator is alright.
  31.  */
  32. int random_range(max)
  33. int max;
  34.     {
  35.     static init = 0;
  36.  
  37.         /* initialize the generator to an appropriate seed eventually */
  38.     if (!init)
  39.         {
  40.         srand(time(0));
  41.         init = 1;
  42.         }
  43.     return rand()%max;
  44.     }
  45.  
  46. /* output(s): output s in a suitable format. Ideally, output() should use
  47.  * the shell quoting conventions for difficult names. Right now, it doesn't
  48.  */
  49. void output(s)
  50. char *s;
  51.     {
  52.     for(; *s; s++)
  53.         switch(*s)
  54.             {
  55.     /*    case ' ':
  56.         case '(':
  57.         case ')':
  58.         case '\\':
  59.             putchar('\\');
  60.             */
  61.         default:
  62.             putchar(*s);
  63.             }
  64.     putchar(' ');
  65.     }
  66.  
  67. int main(argc, argv)
  68. int argc;
  69. char *argv[];
  70.     {
  71.     int i, k;
  72.  
  73.         /* set up everything so that our names are in argv[0 : argc - 2] */
  74.     for (i = argc - 1, argv++; i; i--)
  75.         {
  76.             /* invariant: the remaining names are in argv[0: i - 1] */
  77.         k = random_range(i);
  78.         output(argv[k]);
  79.         argv[k] = argv[i - 1];
  80.         }
  81.     exit(0);
  82.     }
  83.